home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / tools / sharp / sxwork3.lzh / サンプル応用編 / 簡易エディタ / SESCROLL.C < prev   
Text File  |  1994-03-10  |  8KB  |  233 lines

  1. /******************************************************************************
  2.  *    sescroll.c:    スクロール関係の関数
  3.  ******************************************************************************
  4.  *    Workroom SX-68K Sample Program Copyright 1994 SHARP
  5.  */
  6. #include <sxgraph.h>        /* グラフ系マネージャを利用するときに必要 */
  7. #include <control.h>        /* コントロールマンを利用するときに必要    */
  8. #include <text.h>        /* テキストマンを利用するときに必要    */
  9. #include "sedit.h"        /* このプログラム固有のヘッダファイル    */
  10.  
  11. /******************************************************************************
  12.  *    createScrollBar():    スクロールバーを作成する
  13.  ******************************************************************************
  14.  *    引数:    ComVal *pcv    共通変数へのポインタ
  15.  *    戻り値:    BOOLEAN        = TRUE:  作成成功
  16.  *                = FALSE: 作成失敗
  17.  */
  18. BOOLEAN createScrollBar(ComVal *pcv)
  19. {
  20.     Rect rcH, rcV;
  21.  
  22.     /* スクロールバーの位置を計算する */
  23.     pcv->scrlH.val = 0;
  24.     pcv->scrlH.max = 0;
  25.     pcv->scrlH.dMax = 0;
  26.  
  27.     pcv->scrlV.val = 0;
  28.     pcv->scrlV.max = 0;
  29.     pcv->scrlV.dMax = 0;
  30.  
  31.     /* スクロールバーの位置と大きさを計算する */
  32.     rcH = rcV = pcv->windowPtr->graph.rect;
  33.     rcH.d.top = rcH.d.bottom - SCRLBR_H;
  34.     rcH.d.right -= SCRLBR_H;
  35.     rcV.d.left = rcV.d.right - SCRLBR_H;
  36.     rcV.d.bottom -= SCRLBR_H;
  37.  
  38.     pcv->scrlBrHHdl = CMOpen(pcv->windowPtr, &rcH,
  39.         NONTITLE, TRUE, 0, 0, 0, CI_SCLBRWH << 4, 0);
  40.     if (pcv->scrlBrHHdl == NULL)
  41.         return FALSE;
  42.  
  43.     pcv->scrlBrVHdl = CMOpen(pcv->windowPtr, &rcV,
  44.         NONTITLE, TRUE, 0, 0, 0, CI_SCLBRWV << 4, 0);
  45.     if (pcv->scrlBrVHdl == NULL)
  46.         return FALSE;
  47.  
  48.     return TRUE;
  49. }
  50.  
  51. /******************************************************************************
  52.  *    checkScrollBar():    スクロールバーのパートごとの処理
  53.  ******************************************************************************
  54.  *    引数:    ComVal *pcv    共通変数へのポインタ
  55.  *    戻り値:    int        パートコード
  56.  */
  57. int checkScrollBar(ComVal *pcv)
  58. {
  59.     int partCode;            /* コントロールのパートコード    */
  60.     int sig = 1;            /* スクロールの方向(1 / -1)    */
  61.     long offset[2];
  62.     LPoint lpt;
  63.     Control **ctrlHdl;        /* コントロールハンドル        */
  64.  
  65.     GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
  66.  
  67.     /* テキストエディットをアップデートする */
  68.     TMUpDateExist(pcv->tEditHdl, 1);
  69.     /* 現在のオフセット値を取得する */
  70.     TMGetDestOffset(pcv->tEditHdl, offset);
  71.     /* ポインタ座標をローカル座標系に変換する */
  72.     lpt = GMGlobalToLocal(pcv->event.ev.where.x_y);
  73.     partCode = CMFind(lpt, pcv->windowPtr, &ctrlHdl);
  74.     switch(partCode) {
  75.     case C_INTHUMB:            /* スクロールボックス        */
  76.         CMCheck(ctrlHdl, lpt, NULL);
  77.         if (ctrlHdl == pcv->scrlBrHHdl)
  78.             offset[0] = CMValueGet(ctrlHdl);
  79.         else if (ctrlHdl == pcv->scrlBrVHdl)
  80.             offset[1] = CMValueGet(ctrlHdl) * (1 << pcv->scrlShift);
  81.         break;
  82.     case C_INUP:            /* スクロールアップボタン    */
  83.         sig = -1;
  84.         /* この処理は下に続きます */
  85.     case C_INDOWN:            /* スクロールダウンボタン    */
  86.         /* SHIFTキーが押されてないか? */
  87.         if (!(pcv->event.ev.how & KS_SHIFT)) {
  88.             if (ctrlHdl == pcv->scrlBrHHdl) {
  89.                 /* 横8文字分スクロール */
  90.                 offset[0] += FONTSIZE * 8 * sig;
  91.                 if (offset[0] < 0)
  92.                     offset[0] = 0;
  93.                 else if (offset[0] >  CMMaxGet(ctrlHdl))
  94.                     offset[0] = CMMaxGet(ctrlHdl);
  95.             } else if (ctrlHdl == pcv->scrlBrVHdl)
  96.                 /* 縦3行分スクロール */
  97.                 offset[1] += (*pcv->tEditHdl)->lineHeight * 3 * sig;
  98.             break;
  99.         }
  100.         /* この処理は下に続きます */
  101.     case C_INPGUP:            /* ページスクロールアップボタン    */
  102.         if (partCode == C_INPGUP)
  103.             sig = -1;
  104.         /* この処理は下に続きます */
  105.     case C_INPGDOWN:        /* ページスクロールダウンボタン    */
  106.         if (ctrlHdl == pcv->scrlBrHHdl) {
  107.             /* 横表示桁数分スクロール */
  108.             offset[0] += ((*pcv->tEditHdl)->view.d.right
  109.                 - (*pcv->tEditHdl)->view.d.left) * sig;
  110.             if (offset[0] < 0)
  111.                 offset[0] = 0;
  112.             else if (offset[0] >  CMMaxGet(ctrlHdl))
  113.                 offset[0] = CMMaxGet(ctrlHdl);
  114.         } else if (ctrlHdl == pcv->scrlBrVHdl)
  115.             /* 縦表示行数分スクロール */
  116.             offset[1] += ((*pcv->tEditHdl)->view.d.bottom
  117.                 - (*pcv->tEditHdl)->view.d.top) * sig;
  118.         break;
  119.     default:
  120.         return 0;
  121.     }
  122.  
  123.     /* テキストエディットをスクロールさせる */
  124.     TMSetDestOffset(pcv->tEditHdl, offset[0], offset[1]);
  125.     setScrollBar(pcv);
  126.     return partCode;
  127. }
  128.  
  129. /******************************************************************************
  130.  *    setScrollBar():    スクロールバーに値を設定する
  131.  ******************************************************************************
  132.  *    引数:    ComVal *pcv    共通変数へのポインタ
  133.  */
  134. void setScrollBar(ComVal *pcv)
  135. {
  136.     ScrlVal svH, svV;
  137.  
  138.     /* スクロールバーの現在値、最大値を算出する */
  139.     calcScrollBar(pcv, &svH, &svV);
  140.  
  141.     if (svH.val != pcv->scrlH.val || svH.max != pcv->scrlH.max
  142.      || svH.dMax != pcv->scrlH.dMax) { /* 値に変更があるか?    */
  143.         /* コントロール定義関数のデータを設定する */
  144.         CMDefDataSet(pcv->scrlBrHHdl, LONGWORD(1, svH.dMax));
  145.         CMMaxSet(pcv->scrlBrHHdl, svH.max);
  146.         CMValueSet(pcv->scrlBrHHdl, svH.val);
  147.         pcv->scrlH = svH;
  148.     }
  149.  
  150.     if (svV.val != pcv->scrlV.val || svV.max != pcv->scrlV.max
  151.      || svV.dMax != pcv->scrlV.dMax) { /* 値に変更があるか?    */
  152.         /* コントロール定義関数のデータを設定する */
  153.         CMDefDataSet(pcv->scrlBrVHdl, LONGWORD(1, svV.dMax));
  154.         CMMaxSet(pcv->scrlBrVHdl, svV.max);
  155.         CMValueSet(pcv->scrlBrVHdl, svV.val);
  156.         pcv->scrlV = svV;
  157.     }
  158. }
  159.  
  160. /******************************************************************************
  161.  *    calcScrollBar():    スクロールバーの現在値、最大値の算出
  162.  ******************************************************************************
  163.  *    引数:    ComVal *pcv    共通変数へのポインタ
  164.  *        ScrlVal *pvalh    横スクロールバーの値を格納するポインタ
  165.  *        ScrlVal *pvalv    縦スクロールバーの        〃
  166.  */
  167. void calcScrollBar(ComVal *pcv, ScrlVal *pvalh, ScrlVal *pvalv)
  168. {
  169.     int edit, view, off, shift = 0;
  170.     TEdit *ptEdit = *pcv->tEditHdl;
  171.  
  172.     /* 縦方向のスクロール */
  173.     edit = ptEdit->nLines * ptEdit->lineHeight; /* 全体の行数    */
  174.     /* テキスト先頭から表示の最下位行までの行数 */
  175.     off = ptEdit->view.d.bottom - ptEdit->offsetV;
  176.     edit = (edit < off) ? off : edit; /* 全体行数を補正する        */
  177.     /* edit が 0x3f00 以下になるまで右シフトする */
  178.     while (edit > 0x3f00) {
  179.         edit >>= 1;
  180.         shift++;        /* シフト回数をカウントする    */
  181.     }
  182.     pvalv->dMax = edit;        /* コントロール定義関数のデータ    */
  183.     pcv->scrlShift = shift;
  184.     /* 最大値を計算する */
  185.     view = ptEdit->view.d.bottom - ptEdit->view.d.top;
  186.     view >>= shift;            /* edit と同じ回数右シフトする    */
  187.     pvalv->max = edit - view;
  188.     /* 現在値を計算する */
  189.     view = ptEdit->view.d.top - ptEdit->offsetV;
  190.     view >>= shift;            /* edit と同じ回数右シフトする    */
  191.     pvalv->val = view;
  192.  
  193.     /* 横方向のスクロール */
  194.     edit = ptEdit->dest.d.right - ptEdit->dest.d.left;
  195.     off = ptEdit->view.d.right - ptEdit->offsetH;
  196.     edit = (edit < off) ? off : edit; /* 全体行数を補正する        */
  197.     /* 全体桁数(コントロール定義関数で使用)*/
  198.     pvalh->dMax = edit;
  199.     /* 最大値を計算する */
  200.     view = ptEdit->view.d.right - ptEdit->dest.d.left;
  201.     pvalh->max = edit - view;
  202.     /* 現在値を計算する */
  203.     pvalh->val = ptEdit->dest.d.left - ptEdit->offsetH;
  204. }
  205.  
  206. /******************************************************************************
  207.  *    resizeScrollBar():    スクロールバーのサイズ変更
  208.  ******************************************************************************
  209.  *    引数:    ComVal *pcv    共通変数へのポインタ
  210.  */
  211. void resizeScrollBar(ComVal *pcv)
  212. {
  213.     Rect rcH, rcV;
  214.  
  215.     /* スクロールバーの位置と大きさを計算する */
  216.     rcH = rcV = pcv->windowPtr->graph.rect;
  217.     rcH.d.top = rcH.d.bottom - SCRLBR_H;
  218.     rcH.d.right -= SCRLBR_H;
  219.     rcV.d.left = rcV.d.right - SCRLBR_H;
  220.     rcV.d.bottom -= SCRLBR_H;
  221.  
  222.     CMHide(pcv->scrlBrHHdl);    /* スクロールバーを消去する    */
  223.     CMHide(pcv->scrlBrVHdl);
  224.  
  225.     CMMove(pcv->scrlBrHHdl, rcH.l.l_t);
  226.     CMSize(pcv->scrlBrHHdl, LONGWORD(rcH.d.right - rcH.d.left, SCRLBR_H));
  227.     CMMove(pcv->scrlBrVHdl, rcV.l.l_t);
  228.     CMSize(pcv->scrlBrVHdl, LONGWORD(SCRLBR_H, rcV.d.bottom - rcV.d.top));
  229.  
  230.     CMShow(pcv->scrlBrHHdl);    /* スクロールバーを表示する    */
  231.     CMShow(pcv->scrlBrVHdl);
  232. }
  233.